home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Taifun / Taifun 025 (1987-08-15)(Ossowski, Stefan)(DE)(PD).zip / Taifun 025 (1987-08-15)(Ossowski, Stefan)(DE)(PD).adf / Fractals / fractals.source < prev    next >
C/C++ Source or Header  |  1987-03-08  |  5KB  |  256 lines

  1. /*
  2.    Fractals - Programm fuer den Amiga von Christian Schneider
  3.    Original-Version von Frank Mathy fuer Atari ST
  4.    Verbesserungen: farbliche Hoehenabstufungen, Fenster
  5. */
  6.  
  7. #include <exec/types.h>
  8. #include <intuition/intuition.h>
  9. #include <functions.h>
  10. #include <graphics/gfxmacros.h>
  11.  
  12. #define TIEFE 4
  13. #define BREITE 640
  14. #define HOEHE 200
  15. #define FARBEN 16
  16. #define LINKSOBEN 0,16
  17.  
  18. #define ECKEN 64
  19.  
  20. struct IntuitionBase *IntuitionBase; 
  21. struct GfxBase *GfxBase;
  22. struct Screen *Screen;
  23. struct Window *Window;   
  24. struct IntuiMessage *Message;
  25.  
  26. struct NewScreen NewScreen =
  27.   {
  28.    0, 0,      /* linke obere Ecke */
  29.    640,      /* Breite */
  30.    256,      /* Hoehe */
  31.    TIEFE,      /* Tiefe */
  32.    0, 1,      /* DetailPen und BlockPen */
  33.    HIRES,         /* Anzeige-Modi */
  34.    CUSTOMSCREEN,   /* Screen-Typ */
  35.    NULL,      /* Font */
  36.    "640*256 16 Farben Screen (Atari go home!)",/* Titel */
  37.    NULL,      /* Gadgets */
  38.    NULL         /* keine custom bit map */
  39.   };
  40.  
  41. struct NewWindow NewWindow =
  42.   {
  43.    LINKSOBEN,      /* linke, obere Ecke */
  44.    BREITE, HOEHE,   /* Breite, Hoehe */
  45.    0, 1,      /* Detail-, BlockPen Farbe */
  46.    MOUSEBUTTONS|CLOSEWINDOW,   /* IDCMP Flags */
  47.    ACTIVATE|WINDOWCLOSE|WINDOWDEPTH|WINDOWDRAG
  48.    |SMART_REFRESH|GIMMEZEROZERO, /* Flags */
  49.    NULL,      /* erstes Gadget */
  50.    NULL,      /* Check Marke */
  51.    "Christian Schneiders: Schottische Küstenimpressionen",/* Titelstring */
  52.    NULL,      /* Bildschirm */
  53.    NULL,      /* Bitmap-Pointer */
  54.    50, 20,      /* min. Breite, Hoehe */
  55.    BREITE, HOEHE,   /* max. Breite, Hoehe */      
  56.    CUSTOMSCREEN      /* Typ */      
  57.   };
  58.  
  59. #define INTUITION_REV   29L  /* Versionsnummer! */
  60. #define GRAPHICS_REV   29L
  61.  
  62. /* Globale Arbeitsvariablen */
  63.  
  64. struct RastPort *rp;   /* RastPort-Adresse fuers Zeichnen */
  65. struct ViewPort *vp;
  66. short punkte[8];
  67. short h[ECKEN][ECKEN],sw,aw,l,yg;
  68. static short rdiv[]={63,31,15,7,3,1,0};
  69.  
  70. random(level)
  71. short level;
  72. {
  73.   return((rand()&rdiv[level-1])-rdiv[level]);
  74. }
  75.  
  76. make_Fractal()
  77. {
  78.    register short a2,xz,yz;
  79.  
  80.    h[0][0]=0;
  81.    h[0][ECKEN]=0;   
  82.    sw=ECKEN/2;
  83.    aw=ECKEN;
  84.    a2=ECKEN/2;
  85.  
  86.    for(l=1; l<=6; l++) {
  87.    yz=0;
  88.    yg=0;
  89.    do {
  90.         if(yg++%2==0) {
  91.       xz=sw;
  92.       do {
  93.            h[xz][yz]=(h[xz-a2][yz]+h[xz+a2][yz])/2+random(l);
  94.            xz+=aw;
  95.       } while(xz<ECKEN-yz);
  96.         }
  97.         else {
  98.       xz=0;
  99.       do {
  100.            h[xz][yz]=(h[xz][yz-a2]+h[xz][yz+a2])/2+random(l);
  101.            xz+=a2;
  102.            h[xz][yz]=(h[xz-a2][yz+a2]+h[xz+a2][yz-a2])/2+random(l);
  103.            xz+=a2;
  104.       } while(xz<=ECKEN-yz);
  105.         }
  106.         yz+=a2;
  107.    } while(yz<ECKEN);
  108.    aw/=2;
  109.    a2/=2;
  110.    sw/=2;
  111.    }
  112. }
  113.  
  114. draw_Fractal()
  115. {
  116.  
  117. /*
  118. #asm
  119.  
  120. ;   D0,D1,A0 : Arbeitsregister
  121. ;   D7    : Temporaere Var.
  122. ;   D2,D3 : x,y
  123. ;   D4    : Farbe
  124. ;   D5,D6 : Offsets
  125. ;   A1    : Basisadresse des h-Arrays
  126. ;   A2    : Basisadresse des Punkte-Arrays
  127. ;   A6    : Basisadresse der Grafik-Lib.
  128.  
  129. PolyDraw   EQU -30 -306
  130. Move      EQU -30 -210
  131. SetAPen      EQU -30 -312
  132.  
  133. #macro   Check
  134.    tst   (a1,d6)
  135.    bgt   nein1
  136.    lea   (a2,d5),a0
  137.    sub   (a0),d0
  138.    move   d0,(a0)
  139.    lea   (a1,d6),a0
  140.    move   (a0),d0
  141.    asl   #1,d0
  142.    addq   #2,d0
  143.    move   d0,(a0)
  144. nein
  145. #endm
  146.  
  147. Start   move.l   _h,a1
  148.    move.l   _punkte,a2
  149.    move.l   _GfxBase,a6
  150.    move.l   -2,d6
  151.    clr   d2
  152. Y_Loop   clr   d3
  153. X_Loop   moveq.b   #1,d4
  154.    move   d2,d0
  155.    moveq   #10,d1
  156.    mulu   d1,d0
  157.    move   d0,d7
  158.    move   d3,d0
  159.    moveq   #5,d1
  160.    mulu   d1,d0
  161.    add   d7,d0
  162.    move   d0,(a2)
  163.    move   d3,d0
  164.    asl   #1,d0
  165.    addq   #36,d0
  166.    moveq   #1,d5
  167.    lea   (a2,d5),a0
  168.    move   d0,(a0)
  169.    addq   #2,d5
  170.    addq   #2,d6
  171.    Check:
  172.    addq   #2,d5
  173.    addq   #128,d6
  174.    Check:
  175.  
  176. */
  177.  
  178.    REGISTER UWORD x,y;
  179.    REGISTER UBYTE pencol;
  180.  
  181.    for(y=0; y<ECKEN; y++)
  182.      for(x=0; x<ECKEN-y; x++) {
  183.    pencol=1;
  184.    punkte[0]=x*10+y*5;
  185.    punkte[1]=y*2+36;
  186.    if(h[x][y]>0) {
  187.       punkte[1]-=h[x][y];
  188.       pencol=h[x][y]/2+2;
  189.    }
  190.    punkte[2]=punkte[0]+10;
  191.    punkte[3]=y*2+36;
  192.    if(h[x+1][y]>0) {
  193.       punkte[3]-=h[x+1][y];
  194.       pencol=h[x+1][y]/2+2;
  195.    }
  196.    punkte[4]=punkte[0]+5;
  197.    punkte[5]=y*2+38;
  198.    if(h[x][y+1]>0) {
  199.       punkte[5]-=h[x][y+1];
  200.       pencol=h[x][y+1]/2+2;
  201.    }
  202.    punkte[6]=punkte[0];
  203.    punkte[7]=punkte[1];
  204.    if(pencol>=FARBEN)
  205.       pencol=FARBEN-1;
  206.    SetAPen(rp,pencol);
  207.    Move(rp,punkte[0],punkte[1]);
  208.    PolyDraw(rp,3,&punkte[2]);
  209.      }
  210. }
  211.  
  212. main() 
  213. {
  214.   SHORT i;
  215.  
  216.   IntuitionBase=OpenLibrary("intuition.library",INTUITION_REV);
  217.   if(IntuitionBase==NULL) exit(FALSE);
  218.  
  219.   GfxBase=OpenLibrary("graphics.library",GRAPHICS_REV);
  220.   if(GfxBase==NULL) exit(FALSE);
  221.  
  222.   Screen=OpenScreen(&NewScreen);
  223.   if(Screen==NULL)
  224.      exit(FALSE);
  225.   vp=&(Screen->ViewPort);
  226.   SetRGB4(vp,0,0,0,0);   /* Hintergrund schwarz */
  227.   SetRGB4(vp,1,3,6,11);   /* Wasserfarbe */
  228.   for(i=2; i<=15; i++)   /* restliche Farben setzen */
  229.      SetRGB4(vp,i,i/3+5,i,i/2+2);
  230.  
  231.   NewWindow.Screen=Screen;
  232.   Window=OpenWindow(&NewWindow);
  233.   if(Window==NULL)
  234.      exit(FALSE);
  235.  
  236.   rp=Window->RPort;   /* RastPort-Adresse */
  237.   SetDrMd(rp,JAM1);   /* Zeichenmodus */
  238.   srand((int)Window);   /* Saat fuer Zufallsgen. */
  239.   i=0;
  240.   do {
  241.    if(++i%2) {
  242.          OFF_DISPLAY;    /* Bildschirm aus */
  243.       make_Fractal();
  244.       SetRast(rp,0);   /* Fenster loeschen */
  245.       ON_DISPLAY;
  246.       draw_Fractal();
  247.    }
  248.    WaitPort(Window->UserPort);
  249.    Message=GetMsg(Window->UserPort);
  250.   } while (Message->Class!=CLOSEWINDOW);
  251.  
  252.   CloseWindow(Window);
  253.   CloseScreen(Screen);
  254.   exit(TRUE);
  255. }
  256.